package pe.com.empresa.web.actions.compras;

import java.math.BigDecimal;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import pe.com.empresa.datos.dominio.Comprobante;
import pe.com.empresa.datos.dominio.ComprobanteArticulo;
import pe.com.empresa.datos.dominio.ConsultaListaDetalleOrdenCompra;
import pe.com.empresa.datos.dominio.ConsultaListaDetalleOrdenCompraCriteria;
import pe.com.empresa.datos.dominio.ConsultaListaGuiaRemision;
import pe.com.empresa.datos.dominio.ConsultaListaGuiaRemisionCriteria;
import pe.com.empresa.datos.dominio.ConsultaObtenerOrdenCompra;
import pe.com.empresa.datos.dominio.ConsultaObtenerOrdenCompraCriteria;
import pe.com.empresa.datos.dominio.ConsultaObtenerProveedores;
import pe.com.empresa.datos.dominio.GuiaRemision;
import pe.com.empresa.datos.dominio.Kardex;
import pe.com.empresa.servicios.businessdelegate.ComprasBusinessDelegate;
import pe.com.empresa.servicios.businessdelegate.PersonasBusinessDelegate;
import pe.com.empresa.servicios.servicio.BuscarPersonaService;
import pe.com.empresa.servicios.servicio.GestionarGuiasRemisionService;
import pe.com.empresa.utiles.ActionHelper;
import pe.com.empresa.utiles.Constantes;
import pe.com.empresa.utiles.EstadoOperacion;
import pe.com.empresa.utiles.GrillaArticulos;

public class GestionarGuiasRemisionAction extends ActionHelper {


	private static final long serialVersionUID = -3986208878619969114L;

	private List<ConsultaObtenerProveedores> listaProveedores;
	private ConsultaListaGuiaRemisionCriteria criteria;
	private String fechaRegistroDesde;
	private String fechaRegistroHasta;
	private String numeroOrdenCompra;
	
	private String numeroGuiaRemision;
	private String fechaInicioTraslado;
	
	
	private EstadoOperacion estadoOperacion = new EstadoOperacion();
	private String stringJson;
	
	
	
	private BuscarPersonaService serviceBuscarPersona = new PersonasBusinessDelegate().getBuscarPersonaService();
	private GestionarGuiasRemisionService serviceGuiasRemision = new ComprasBusinessDelegate().getGestionarGuiasRemisionService();
	
	public GestionarGuiasRemisionAction() {
		// TODO Auto-generated constructor stub
		serviceBuscarPersona.setSqlSessionFactory(this.getSqlSessionFactory());
		serviceGuiasRemision.setSqlSessionFactory(this.getSqlSessionFactory());
	}
	
	@Override
	public String execute() throws Exception {
		
		if(!this.validarInicioSesion()){
			System.out.println("Inicio de sesion invalido o expirado!!");
			return ERROR;
		}
		
		listaProveedores = serviceBuscarPersona.obtenerProveedores();
		// TODO Auto-generated method stub
		return SUCCESS;
	}

	@SuppressWarnings("unchecked")
	public String filtrarPorDefecto(){
		try {
			serviceGuiasRemision.openSession();
			List<ConsultaListaGuiaRemision> list = this.serviceGuiasRemision.selectByCriteria("ConsultaListaGuiaRemision", "ConsultaListaGuiaRemisionPorDefecto", new ConsultaListaGuiaRemisionCriteria());
			serviceGuiasRemision.closeSession();
			stringJson = this.toListJson(list);
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return SUCCESS;
	}
	
	@SuppressWarnings("unchecked")
	public String filtrar(){
		try {
			
			serviceGuiasRemision.openSession();
			criteria.setFechaRegistroDesde(this.dateFormat(this.fechaRegistroDesde));
			criteria.setFechaRegistroHasta(this.dateFormat(this.fechaRegistroHasta));
			List<ConsultaListaGuiaRemision> list = serviceGuiasRemision.selectByCriteria("ConsultaListaGuiaRemision", criteria);
			serviceGuiasRemision.closeSession();
			stringJson = this.toListJson(list);
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return SUCCESS;
	}
	
	@SuppressWarnings("unchecked")
	public String obtenerOdenCompra(){
		ConsultaObtenerOrdenCompra orden = null;
		try {
			serviceGuiasRemision.openSession();
			
			ConsultaObtenerOrdenCompraCriteria criteria = new ConsultaObtenerOrdenCompraCriteria();
			criteria.setNumeroOrdenCompra(numeroOrdenCompra);
			List<ConsultaObtenerOrdenCompra> list = serviceGuiasRemision.selectByCriteria("ConsultaObtenerOrdenCompra", criteria);
			if(!list.isEmpty()){
				orden = list.get(0);
				
				ConsultaListaDetalleOrdenCompraCriteria criteriaDetalle = new ConsultaListaDetalleOrdenCompraCriteria();
				criteriaDetalle.setNumeroOrdenCompra(numeroOrdenCompra);
				List<ConsultaListaDetalleOrdenCompra> detalleOrden = serviceGuiasRemision.selectByCriteria("ConsultaListaDetalleOrdenCompra", criteriaDetalle);
				
				List<GrillaArticulos> grilla = new ArrayList<GrillaArticulos>();
				
				for(ConsultaListaDetalleOrdenCompra d : detalleOrden){
					GrillaArticulos articulo = new GrillaArticulos();
					articulo.setCodigoArticulo(d.getCodigoArticulo());
					articulo.setDescripArticulo(d.getNombreArticulo());
					articulo.setCantidadArticulo(d.getCantidadArticulo());
					articulo.setPrecio(new BigDecimal(d.getPrecioUnitario()));
					articulo.setSubTotal(new BigDecimal(articulo.getCantidadArticulo().intValue() * articulo.getPrecio().doubleValue()));
					articulo.setCantidadAfectada("");
					articulo.setFechaVencimiento("");
					articulo.setDescripIncidencia("");
					grilla.add(articulo);
				}
				
				this.getSessionContext().setAttribute(Constantes.SESION_GRILLA_ARTICULOS, grilla);
				
			}else{
				orden = new ConsultaObtenerOrdenCompra();
				orden.setNumeroOrdenCompra("-1");
				this.getSessionContext().removeAttribute(Constantes.SESION_GRILLA_ARTICULOS);
			}
			
			stringJson = this.toJson(orden);
			
			serviceGuiasRemision.closeSession();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return SUCCESS;
	}
	
	public String registrarGuiaRemision(){
		
		if(!this.validarInicioSesion()){
			System.out.println("Inicio de sesion invalido o expirado!!");
			return ERROR;
		}
		
		this.getSessionContext().removeAttribute(Constantes.SESION_GRILLA_ARTICULOS);
		return SUCCESS;
	}
	
	@SuppressWarnings("unchecked")
	public String grabarGuiaRemision(){
		
		try {
			serviceGuiasRemision.openSession();
			List<GrillaArticulos> grilla = (List<GrillaArticulos>) getSessionContext().getAttribute(Constantes.SESION_GRILLA_ARTICULOS);
			if(grilla != null){
				
			Comprobante comprobante = new Comprobante();
			comprobante.setNumeroComprobante(this.numeroGuiaRemision);
			comprobante.setFechaRegistro(new Date());
			comprobante.setTipo_comprobante(2); //comprobante recepcion
			comprobante.setEstado(1);
			
			serviceGuiasRemision.insertar(comprobante);
			
			GuiaRemision guia = new GuiaRemision();
			guia.setNumeroComprobante(this.numeroGuiaRemision);
			guia.setFechaInicioTraslado(this.dateFormat(this.fechaInicioTraslado));
			guia.setNumeroOrdenCompra(numeroOrdenCompra);
			
			serviceGuiasRemision.insertar(guia);
			
				for(GrillaArticulos g : grilla){
					ComprobanteArticulo ca = new ComprobanteArticulo();
					ca.setNumeroComprobante(numeroGuiaRemision);
					ca.setCodigoArticulo(g.getCodigoArticulo());
					ca.setCantidadArticulo(g.getCantidadArticulo());
					ca.setPrecioUnitario(g.getPrecio());
					
					ca.setFechaVencimiento((g.getFechaVencimiento().equals("") ? null : dateFormat(g.getFechaVencimiento())));
					ca.setCantidadAfectada(g.getCantidadAfectada().equals("") ? null : Integer.parseInt(g.getCantidadAfectada()));
					ca.setDescripIncidencia((g.getDescripIncidencia().equals("")) ? null : g.getDescripIncidencia());
					
					serviceGuiasRemision.insertar(ca);
					
					Kardex kardex = new Kardex();
					kardex.setNumeroComprobante(numeroGuiaRemision);
					kardex.setCodigoArticulo(ca.getCodigoArticulo());
					kardex.setTipo_movimiento(Constantes.TIPO_MOVIMIENTO_ENTRADA_COMPRA);
					kardex.setCantidadArticulo(ca.getCantidadArticulo());
					kardex.setValorUnitario(ca.getPrecioUnitario());
					kardex.setFechaVencimiento(ca.getFechaVencimiento());
					kardex.setEstado(1);
					kardex.setFechaRegistro(new Date());
					
					serviceGuiasRemision.insertar(kardex);
					
					if(ca.getCantidadAfectada() != null){
						kardex = new Kardex();
						kardex.setNumeroComprobante(numeroGuiaRemision);
						kardex.setCodigoArticulo(ca.getCodigoArticulo());
						kardex.setTipo_movimiento(Constantes.TIPO_MOVIMIENTO_ENTRADA_DEVOLUCION);
						kardex.setCantidadArticulo(ca.getCantidadAfectada().intValue() * -1);
						kardex.setValorUnitario(ca.getPrecioUnitario());
						kardex.setFechaVencimiento(ca.getFechaVencimiento());
						kardex.setEstado(1);
						kardex.setFechaRegistro(new Date());
						
						serviceGuiasRemision.insertar(kardex);
						
					}
					
				}
			
			serviceGuiasRemision.commit();
			
			estadoOperacion.setEstadoOperacion(Constantes.OP_SUCCESS);
			estadoOperacion.setMensajeEstado("La Guia de Remision de registro con exito.");
			
			}else{
				estadoOperacion.setEstadoOperacion(Constantes.OP_EXCEPTION);
				estadoOperacion.setMensajeEstado("Error, Necesita tener como minimo un item en la grilla de articulos.");
				serviceGuiasRemision.rollback();
			}
			
			serviceGuiasRemision.closeSession();
		}  catch (Exception e) {
			// TODO Auto-generated catch block
			
			estadoOperacion.setEstadoOperacion(Constantes.OP_EXCEPTION);
			estadoOperacion.setMensajeEstado("Error, Registrando guia de remision, intentelo mas tarde.");
			
			e.printStackTrace();
		}
		
		return SUCCESS;
	}
	
	public List<ConsultaObtenerProveedores> getListaProveedores() {
		return listaProveedores;
	}

	public void setListaProveedores(
			List<ConsultaObtenerProveedores> listaProveedores) {
		this.listaProveedores = listaProveedores;
	}

	public EstadoOperacion getEstadoOperacion() {
		return estadoOperacion;
	}

	public void setEstadoOperacion(EstadoOperacion estadoOperacion) {
		this.estadoOperacion = estadoOperacion;
	}

	public String getStringJson() {
		return stringJson;
	}

	public void setStringJson(String stringJson) {
		this.stringJson = stringJson;
	}

	public ConsultaListaGuiaRemisionCriteria getCriteria() {
		return criteria;
	}

	public void setCriteria(ConsultaListaGuiaRemisionCriteria criteria) {
		this.criteria = criteria;
	}

	public String getFechaRegistroDesde() {
		return fechaRegistroDesde;
	}

	public void setFechaRegistroDesde(String fechaRegistroDesde) {
		this.fechaRegistroDesde = fechaRegistroDesde;
	}

	public String getFechaRegistroHasta() {
		return fechaRegistroHasta;
	}

	public void setFechaRegistroHasta(String fechaRegistroHasta) {
		this.fechaRegistroHasta = fechaRegistroHasta;
	}

	public String getNumeroOrdenCompra() {
		return numeroOrdenCompra;
	}

	public void setNumeroOrdenCompra(String numeroOrdenCompra) {
		this.numeroOrdenCompra = numeroOrdenCompra;
	}

	public String getNumeroGuiaRemision() {
		return numeroGuiaRemision;
	}

	public void setNumeroGuiaRemision(String numeroGuiaRemision) {
		this.numeroGuiaRemision = numeroGuiaRemision;
	}

	public String getFechaInicioTraslado() {
		return fechaInicioTraslado;
	}

	public void setFechaInicioTraslado(String fechaInicioTraslado) {
		this.fechaInicioTraslado = fechaInicioTraslado;
	}

}
